/**
 * 
 */
package services.communication;

import org.springframework.context.support.FileSystemXmlApplicationContext;

import services.communication.chat.SimpleChatClient;
import services.communication.chat.SimpleChatClientIF;
import services.communication.chat._static.CommunicationChatServiceProxy;
import services.communication.mail.SimpleMailClient;
import services.communication.mail.SimpleMailClientIF;
import services.communication.mail._static.CommunicationMailServiceProxy;

/**
 * La clase sigue el patron Factory. Se utiliza para crear instancias de
 * clientes de e-mail y chat que contengan internamente proxys estaticos,
 * dinamicos o hibridos.
 * 
 * @author lito
 */
public class CommunicationClientFactory {
	
	/**
	 * Crea y retorna una instancia de {@link SimpleMailClient} y le setea el
	 * proxy a una instancia de {@link CommunicationMailServiceProxy}.<BR/>
	 * La instanica devuelta tendra seteado el cliente al parametro pasado.
	 * 
	 * @param clientEMail
	 *        El e-mail del usuario que usara la instancia del cliente de mails
	 *        devuelta.
	 * @return Una instancia de {@link SimpleMailClient} y le setea el proxy a
	 *         una instancia de {@link CommunicationMailServiceProxy}.
	 */
	public static SimpleMailClientIF createStaticProxyMailClient(
			String clientEMail) {
		SimpleMailClientIF client = new SimpleMailClient();
		client.setMailServiceProxy(new CommunicationMailServiceProxy());
		client.setClientID(clientEMail);
		return client;
	}
	
	/**
	 * Crea y retorna mediante el framework Spring un {@link SimpleMailClientIF}
	 * cuyo proxy es creado dinamicamente por el mismo framework utilizando el
	 * archivo de configuracion
	 * "src/services/communication/mail/_dynamic/communicationMailService.xml".<BR/>
	 * La instanica devuelta tendra seteado el cliente al parametro pasado.
	 * 
	 * @param clientEMail
	 *        El e-mail del usuario que usara la instancia del cliente de mails
	 *        devuelta.
	 * @return Crea y retorna mediante el framework Spring un
	 *         {@link SimpleMailClientIF} y cuyo proxy es creado dinamicamente
	 *         por el mismo framework utilizando el archivo de configuracion
	 *         "src/services/communication/mail/_dynamic/communicationMailService.xml"
	 *         .
	 */
	public static SimpleMailClientIF createDynamicProxyMailClient(
			String clientEMail) {
		
		FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(
				"src/services/communication/mail/_dynamic/communicationMailService.xml");
		SimpleMailClientIF client = (SimpleMailClientIF) ctx
				.getBean("mailClient");
		client.setClientID(clientEMail);
		return client;
	}
	
	/**
	 * Crea y retorna mediante el framework Spring un {@link SimpleMailClientIF}
	 * cuyo proxy es seeado a una instancia de
	 * {@link CommunicationMailServiceProxy} por el mismo framework (solucion
	 * hibrida) utilizando el archivo de configuracion
	 * "src/services/communication/mail/_hybrid/communicationMailService.xml".<BR/>
	 * La instanica devuelta tendra seteado el cliente al parametro pasado.
	 * 
	 * @param clientEMail
	 *        El e-mail del usuario que usara la instancia del cliente de mails
	 *        devuelta.
	 * @return Crea y retorna mediante el framework Spring un
	 *         {@link SimpleMailClientIF} cuyo proxy es seeado a una instancia
	 *         de {@link CommunicationMailServiceProxy} por el mismo framework
	 *         (solucion hibrida) utilizando el archivo de configuracion
	 *         "src/services/communication/mail/_hybrid/communicationMailService.xml"
	 *         .
	 */
	public static SimpleMailClientIF createHybridProxyMailClient(
			String clientEMail) {
		
		FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(
				"src/services/communication/mail/_hybrid/communicationMailService.xml");
		SimpleMailClientIF client = (SimpleMailClientIF) ctx
				.getBean("mailClient");
		client.setClientID(clientEMail);
		return client;
	}
	
	/**
	 * Crea y retorna una instancia de {@link SimpleChatClient} y le setea el
	 * proxy a una instancia de {@link CommunicationChatServiceProxy}.<BR/>
	 * La instanica devuelta tendra seteado el cliente al parametro pasado.
	 * 
	 * @param clientID
	 *        El identificador del usuario que usara la instancia del cliente de
	 *        chat devuelta.
	 * @return Una instancia de {@link SimpleChatClient} y le setea el proxy a
	 *         una instancia de {@link CommunicationChatServiceProxy}.
	 */
	public static SimpleChatClientIF createStaticProxyChatClient(String clientID) {
		SimpleChatClientIF client = new SimpleChatClient();
		client.setChatServiceProxy(new CommunicationChatServiceProxy());
		client.setClientID(clientID);
		return client;
	}
	
	/**
	 * Crea y retorna mediante el framework Spring un {@link SimpleChatClientIF}
	 * cuyo proxy es creado dinamicamente por el mismo framework utilizando el
	 * archivo de configuracion
	 * "src/services/communication/chat/_dynamic/communicationChatService.xml".<BR/>
	 * La instanica devuelta tendra seteado el cliente al parametro pasado.
	 * 
	 *@param clientID
	 *        El identificador del usuario que usara la instancia del cliente de
	 *        chat devuelta.
	 * @return Crea y retorna mediante el framework Spring un
	 *         {@link SimpleChatClientIF} cuyo proxy es creado dinamicamente por
	 *         el mismo framework utilizando el archivo de configuracion
	 *         "src/services/communication/chat/_dynamic/communicationChatService.xml"
	 *         .
	 */
	public static SimpleChatClientIF createDynamicProxyChatClient(
			String clientID) {
		
		FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(
				"src/services/communication/chat/_dynamic/communicationChatService.xml");
		SimpleChatClientIF client = (SimpleChatClientIF) ctx
				.getBean("chatClient");
		client.setClientID(clientID);
		return client;
	}
	
	/**
	 * Crea y retorna mediante el framework Spring un {@link SimpleChatClientIF}
	 * cuyo proxy es seteado a una instancia de
	 * {@link CommunicationChatServiceProxy} por el mismo framework (solucion
	 * hibrida) utilizando el archivo de configuracion
	 * "src/services/communication/chat/_hybrid/communicationChatService.xml".<BR/>
	 * La instanica devuelta tendra seteado el cliente al parametro pasado.
	 * 
	 * @param clientID
	 *        El identificador del usuario que usara la instancia del cliente de
	 *        chat devuelta.
	 * @return Crea y retorna mediante el framework Spring un
	 *         {@link SimpleChatClientIF} cuyo proxy es seteado a una instancia
	 *         de {@link CommunicationChatServiceProxy} por el mismo framework
	 *         (solucion hibrida) utilizando el archivo de configuracion
	 *         "src/services/communication/chat/_hybrid/communicationChatService.xml"
	 *         .
	 */
	public static SimpleChatClientIF createHybridProxyChatClient(String clientID) {
		
		FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(
				"src/services/communication/chat/_hybrid/communicationChatService.xml");
		SimpleChatClientIF client = (SimpleChatClientIF) ctx
				.getBean("chatClient");
		client.setClientID(clientID);
		return client;
	}
	
}
